# -*- coding: UTF-8 -*-
"""
Created on 2018年1月3日

@author: hong
1、执行带参数的ＳＱＬ时，请先用sql语句指定需要输入的条件列表，然后再用tuple/list进行条件批配
２、在格式ＳＱＬ中不需要使用引号指定数据类型，系统会根据输入参数自动识别
３、在输入的值中不需要使用转意函数，系统会自动处理
"""

import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
import Config

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
sys.setrecursionlimit(1000000)

"""
Config是一些数据库的配置文件
"""
class DB(object):
    """
    MYSQL数据库对象，负责产生数据库连接 , 此类中的连接采用连接池实现获取连接对象：conn = Mysql.getConn()
            释放连接对象;conn.close()或del conn
    """
    #连接池对象
    __pool = None
    def __init__(self):
        #数据库构造函数，从连接池中取出连接，并生成操作游标
        self._conn = DB.__getConn()
        self._cursor = self._conn.cursor()

    @staticmethod
    def __getConn():
        """
        @summary: 静态方法，从连接池中取出连接
        @return MySQLdb.connection
        """
        if DB.__pool is None:
            DB.__pool = PooledDB(creator=MySQLdb, mincached=10 , maxcached=100 ,
                              host=Config.DBHOST , port=Config.DBPORT , user=Config.DBUSER , passwd=Config.DBPWD ,
                              db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor)
        return DB.__pool.connection()

    def query(self, sql):
        self.start()
        count = self._cursor.execute(sql)
        rows=self._cursor.fetchall()
        self.dispose()
        return count, rows

    def queryOne(self, sql):
        self.start()
        count = self._cursor.execute(sql)
        row=self._cursor.fetchone()
        self.dispose()
        return row


    def execute(self, sql):
        self.start()
        count = self._cursor.execute(sql)
        self.dispose()
        return count

    def begin(self):
        """
        @summary: 开启事务
        """
        self._conn.autocommit(0)

    def end(self,option='commit'):
        """
        @summary: 结束事务
        """
        if option=='commit':
            self._conn.commit()
        else:
            self._conn.rollback()
    def start(self):
        self._conn = DB.__getConn()
        self._cursor = self._conn.cursor()

    def dispose(self,isEnd=1):
        """
        @summary: 释放连接池资源
        """
        if isEnd==1:
            self.end('commit')
        else:
            self.end('rollback');
        self._cursor.close()
        self._conn.close()

class Data:
    db = DB()

def getDB():
    return DB()
    #return DB("127.0.0.1", "root", "123456", 3306, "liuhua")
    # import tools.DB_Driver as DB
    # db = DB.getDB()